package com.atguigu.gmall.product.controller;

import com.atguigu.gmall.common.result.Result;
import io.minio.BucketExistsArgs;
import io.minio.MakeBucketArgs;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import io.minio.errors.MinioException;
import org.apache.ibatis.io.ResolverUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.util.UUID;

/**
 * @author atguigu-mqx
 */
@RestController
@RequestMapping("/admin/product")
@RefreshScope
public class FileUploadController {

    //  将文件服务器的ip 用户名，密码获取到这个类中！
    @Value("${minio.endpointUrl}") // 软编码！
    private String endpointUrl;

    @Value("${minio.accessKey}")
    public String accessKey;

    @Value("${minio.secreKey}")
    public String secreKey;

    @Value("${minio.bucketName}")
    public String bucketName;

    //  /admin/product/fileUpload
    //  springmvc 文件上传！ 这个名字file 应该是页面传递的参数名！
    @PostMapping("fileUpload")
    public Result fileUpload(MultipartFile file) throws Exception{
        //  声明一个url 变量接收上传之后的路径！
        String url="";
        // 使用MinIO服务的URL，端口，Access key和Secret key创建一个MinioClient对象
        //  MinioClient minioClient = new MinioClient("https://play.min.io", "Q3AM3UQ867SPQQA43P2F", "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG");
        MinioClient minioClient =
                MinioClient.builder()
                        .endpoint(endpointUrl)
                        .credentials(accessKey, secreKey)
                        .build();
        // 检查存储桶是否已经存在
        boolean isExist = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
        //  判断桶是否存在！
        if(isExist) {
            System.out.println("Bucket already exists.");
        } else {
            // 创建一个名为asiatrip的存储桶，用于存储照片的zip文件。
            minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
        }

        // 使用putObject上传一个文件到存储桶中。
        //  minioClient.putObject("asiatrip","asiaphotos.zip", "/home/user/Photos/asiaphotos.zip");
        //  准备一个文件的名称：
        String fileName = System.currentTimeMillis() + UUID.randomUUID().toString();
        minioClient.putObject(
                PutObjectArgs.builder().bucket(bucketName).object(fileName).stream(
                        file.getInputStream(), file.getSize(), -1)
                        .contentType(file.getContentType())
                        .build());

        //  http://47.93.148.192:9000/gmall/xxx
        //  后缀名：
        url = endpointUrl+"/"+bucketName+"/"+fileName;
        System.out.println("url:\t"+url);

        //  需要将图片上传之后的地址返回！
        return Result.ok(url);
    }
}
